home *** CD-ROM | disk | FTP | other *** search
- Newsgroups: comp.lang.c++
- Path: tday.slip.netcom.com!user
- From: tday@netcom.com (Tony Day)
- Subject: Help with bizzare bug (Long)
- Message-ID: <tday-2702962256130001@tday.slip.netcom.com>
- Sender: netnews@mork.netcom.com
- Nntp-Posting-Host: tday.slip.netcom.com
- Organization: NETCOM On-line Communication Services (408 261-4700 guest)
- Date: Wed, 28 Feb 1996 05:56:13 GMT
-
- I am working through the Prata book to teach myself C++ and I have come
- across a bizzarre bug in my atempt to do one of the problems. The
- conseuence of the bug is that after a certain line of code, "\n" is
- treated as the string "Smiley"!! (Using Symantec 7.0 Mac)
-
- The offending function is an overloaded assignment operator:
-
- >NameAr & NameAr::operator=(const NameAr & a)
- >{
- > if (this == &a) // if object assigned to self,
- > return *this; // don't change anything
- > ArrayDb::operator=(a);
- > delete [] name;
- > name = new char[strlen(a.name)+1];
- > strcpy(name, a.name);
- > return *this;
- >}
-
- and the offending statement is "delete [] name" (if it is removed the
- program runs as wriiten)
-
- I suspect that this is one delete too many, but cannot see why. If anyone
- else can, please let me know. Complete code follows.
-
- Thanks v.very much
-
- Tony
-
-
- HEADER FILE FOR BASE AND DERIVED CLASS
-
- // arraydb.h -- define array class
- #ifndef _ARRAYDB_H_
- #define _ARRAYDB_H_
- #include <iostream.h>
- #include <string.h>
-
- class ArrayDb
- {
- private:
- unsigned int size; // number of array elements
- protected:
- double * arr; // address of first element
- public:
- ArrayDb(); // default constructor
- // create an ArrayDb of n elements, set each to val
- ArrayDb(unsigned int n, double val = 0.0);
- // create an ArrayDb of n elements, initialize to array pn
- ArrayDb(const double * pn, unsigned int n);
- ArrayDb(const ArrayDb & a); // copy constructor
- virtual ~ArrayDb(); // destructor
- unsigned int arsize() const {return size;} // returns array size
- // overloaded operators
- virtual double & operator[](int i); // array indexing
- virtual const double & operator[](int i) const; // array indexing (no =)
- virtual ArrayDb & operator=(const ArrayDb & a);
- friend ostream & operator<<(ostream & os, const ArrayDb & a);
- };
-
- class NameAr: public ArrayDb
- {
- protected:
- char * name;
- public:
- NameAr(); // default constructor
- // create an ArrayDb of n elements, set each to val
- NameAr(unsigned int n, double val = 0.0, char * n = "Smiley");
- // create an ArrayDb of n elements, initialize to array pn
- NameAr(const double * pn, unsigned int n, char * n = "Smiley");
- NameAr(const ArrayDb & a);
- NameAr(const NameAr & a); // copy constructor
- ~NameAr(); // destructor
- NameAr & operator=(const NameAr & a);
- void setname(const char* a);
- friend ostream & operator<<(ostream & os, const NameAr & a);
- };
-
- #endif
-
- CLASS METHODS FOR BASE AND DERIVED CLASS
-
- arraydb.cpp -- ArrayDb class methods
- #include <iostream.h>
- #include <stdlib.h> // exit() prototype
- #include "12_2arraydb.h"
-
- // default constructor -- no arguments
- ArrayDb::ArrayDb()
- {
- arr = NULL;
- size = 0;
- }
-
- // constructs array of n elements, each set to val
- ArrayDb::ArrayDb(unsigned int n, double val)
- {
- arr = new double[n];
- size = n;
- for (int i = 0; i < size; i++)
- arr[i] = val;
- }
-
- // initialize ArrayDb object to a non-class array
- ArrayDb::ArrayDb(const double *pn, unsigned int n)
- {
- arr = new double[n];
- size = n;
- for (int i = 0; i < size; i++)
- arr[i] = pn[i];
- }
-
- // initialize ArrayDb object to another ArrayDb object
- ArrayDb::ArrayDb(const ArrayDb & a)
- {
- size = a.size;
- arr = new double[size];
- for (int i = 0; i < size; i++)
- arr[i] = a.arr[i];
- }
-
- ArrayDb::~ArrayDb()
- {
- delete [] arr;
- }
-
- // let user access elements by index (assignment allowed)
- double & ArrayDb::operator[](int i)
- {
- // check index before continuing
- if (i < 0 || i >= size)
- {
- cerr << "Error in array limits: "
- << i << " is a bad index\n";
- exit(1);
- }
- return arr[i];
- }
-
- // let user access elements by index (assignment disallowed)
- const double & ArrayDb::operator[](int i) const
- {
- // check index before continuing
- if (i < 0 || i >= size)
- {
- cerr << "Error in array limits: "
- << i << " is a bad index\n";
- exit(1);
- }
- return arr[i];
- }
-
- // define class assignment
- ArrayDb & ArrayDb::operator=(const ArrayDb & a)
- {
- if (this == &a) // if object assigned to self,
- return *this; // don't change anything
- delete arr;
- size = a.size;
- arr = new double[size];
- for (int i = 0; i < size; i++)
- arr[i] = a.arr[i];
- return *this;
- }
-
- // quick output, 5 values to a line
- ostream & operator<<(ostream & os, const ArrayDb & a)
- {
- for (int i = 0; i < a.size; i++)
- {
- os << a.arr[i] << " ";
- if (i % 5 == 4)
- os << "\n";
- }
- if (i % 5 != 0)
- os << "\n";
- return os;
- }
-
-
- NameAr::NameAr()
- {
- name = new char[strlen("Smiley")+1];
- name = "Smiley";
- }
-
- NameAr::NameAr(unsigned int n, double val, char * m): ArrayDb(n, val)
- {
- name = new char[strlen(m)+1];
- strcpy(name,m);
- }
-
- NameAr::NameAr(const double * pn, unsigned int n, char * m ): ArrayDb(pn, n)
- {
- name = new char[strlen(m)+1];
- strcpy(name,m);
- }
-
- NameAr::NameAr(const ArrayDb & a): ArrayDb(a)
- {
- name = new char[strlen("Smiley")+1];
- name = "Smiley";
- }
-
- NameAr::NameAr(const NameAr & a)
- {
- ArrayDb::ArrayDb(a);
- name = new char[strlen(a.name)+1];
- strcpy(name,a.name);
- }
-
- NameAr::~NameAr()
- {
- delete [] name;
- }
-
- NameAr & NameAr::operator=(const NameAr & a)
- {
- if (this == &a) // if object assigned to self,
- return *this; // don't change anything
- ArrayDb::operator=(a);
-
- delete [] name;
-
- name = new char[strlen(a.name)+1];
-
- strcpy(name, a.name);
- return *this;
- }
-
- void NameAr::setname(const char* a)
- {
- delete [] name;
- name = new char[strlen(a)+1];
- strcpy(name, a);
- }
-
- ostream & operator<<(ostream & os, const NameAr & a)
- {
- os << ArrayDb(a);
- os << a.name;
- os << "\n";
- return os;
- }
-
- MAIN PROGRAM
-
- //ouze12_2main.cpp for 12.2
-
- #include <iostream.h>
- #include "12_2arraydb.h"
- const int SZ = 5;
- int main(void)
- {
- double it[SZ] = {19.0, 20.0, 18.0, 16.0, 18.5};
- ArrayDb ita(it, SZ);
- cout << "Displaying an ArrayDb object:\n";
- cout << ita;
- NameAr itna(ita); //default name
- cout << "Displaying a NameAr object:\n";
- cout << itna;
- NameAr aldo(2 * SZ, 13.2, "Aldo");
- for (int i = 0; i<2*SZ; i++) // check []
- aldo[i] = aldo[i] + i/2.0;
- cout << aldo;
- itna = aldo; //check assignment
- cout << itna;
-
- return 0;
- }
-